package testing;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.Entity;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.swim.entity.*;
import org.swim.entity.Abilita.Stato;
import org.swim.sessions.*;
import org.swim.entity.Utente.Tipo;
import javax.persistence.*;
import testing.*;
import java.util.Collection;
/**
 * Servlet implementation class servlet1
 */

public class Populate extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	public Populate(){
		super();
	}
	
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		PrintWriter out = response.getWriter();
		out.println("Pagina di popolamento del sistema");
		out.println();
		
		Hashtable<String,String> env = new Hashtable<String,String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		env.put(Context.PROVIDER_URL,"localhost:1099");
		InitialContext ctx;
		GestoreAbilitaRemote amr = null;
		GestoreUtentiRemote umr= null;
		GestoreRichiestaAiutoRemote rmr= null;
		try {
			ctx = new InitialContext(env);
			amr = (GestoreAbilitaRemote)ctx.lookup("GestoreAbilita/remote");
			umr = (GestoreUtentiRemote)ctx.lookup("GestoreUtenti/remote");
			rmr = (GestoreRichiestaAiutoRemote)ctx.lookup("GestoreRichiestaAiuto/remote");
		} catch (Exception e) {
			out.println(e);
		}
		
		try{
			
			// Popolazione del set di abilità del sistema
			Abilita[] ab = new Abilita[10];
			ab[0] =	amr.addAbilita("Idraulico");
			ab[1] = amr.addAbilita("Giardiniere");
			ab[2] = amr.addAbilita("Cuoco");
			ab[3] = amr.addAbilita("Pasticciere");
			ab[4] = amr.addAbilita("Parucchiere");
			ab[5] = amr.addAbilita("Falegname");
			ab[6] = amr.addAbilita("Eletticista");
			ab[7] = amr.addAbilita("Autista");
			ab[8] = amr.addAbilita("Meccanico");
			ab[9] = amr.addAbilita("Pittore");
			
			// Popolazione degli utenti registrati nel sistema
			out.println();
			out.println("---------------- Utenti registati nel sistema -----------------------");
			Utente[] utenti = new Utente[10];
			utenti[0] = umr.addAmministatore();
			out.print(utenti[0].getEmail()+" | ");
			out.print(utenti[0].getPassword()+" | ");
			out.print(utenti[0].getNome()+" | ");
			out.print(utenti[0].getCognome()+" | ");
			out.print(utenti[0].getDataNascita()+" | ");
			out.println(utenti[0].getCitta()+" | ");
			Hashtable<String, Object> dati = new Hashtable<String, Object>();
			for (int i=1; i<=9; i++){
				dati.put("email", "ut"+i+"@swim.org");
				dati.put("nome", "Nome"+i);
				dati.put("cognome", "Cognonme"+i);
				dati.put("dataNascita", new Date(75+i,i,12+i));
				dati.put("citta", "Città"+i);
				dati.put("password", "pass"+i);
				
				utenti[i] = umr.addUtente(dati);
				
				//Stampa a video del set degli utenti
				out.print(utenti[i].getEmail()+" | ");
				out.print(utenti[i].getPassword()+" | ");
				out.print(utenti[i].getNome()+" | ");
				out.print(utenti[i].getCognome()+" | ");
				out.print(utenti[i].getDataNascita()+" | ");
				out.println(utenti[i].getCitta()+" | ");
			}
			
			//Definizione amicizie
			Amicizia a = umr.addAmicizia(utenti[8].getEmail(), utenti[9].getEmail());
			
			a = umr.addAmicizia(utenti[1].getEmail(),utenti[3].getEmail());
			//umr.valutaAmicizia(utenti[1].getEmail(),utenti[3].getEmail(), Status.ACCETTATA);
			umr.valutaAmiciziaById(2, Status.ACCETTATA);
			
			a = umr.addAmicizia(utenti[3].getEmail(),utenti[7].getEmail());
			umr.valutaAmicizia(utenti[3].getEmail(),utenti[7].getEmail(), Status.ACCETTATA);
			
			a = umr.addAmicizia(utenti[4].getEmail(),utenti[5].getEmail());
			
			a = umr.addAmicizia(utenti[6].getEmail(),utenti[1].getEmail());
			umr.valutaAmicizia(utenti[6].getEmail(),utenti[1].getEmail(), Status.ACCETTATA);
			
			//Definizione utente abilita
			for(int i=0; i<10; i++){
				Abilita abilita = umr.addAbilita(utenti[i].getEmail(), ab[i].getNome());
			}
			
			
			//Definizione proposte per nuove abilità
			PropostaAbilita pa = amr.addProposta(utenti[5].getEmail(), "Barista");
			
			pa = amr.addProposta(utenti[3].getEmail(), "Baby sitter");
			
			pa = amr.addProposta(utenti[6].getEmail(), "Baby sitter");
			amr.accettaProposta("Baby sitter");
			
			pa = amr.addProposta(utenti[1].getEmail(), "Giocoliere");
			amr.accettaProposta("Giocoliere");
			
			pa = amr.addProposta(utenti[9].getEmail(), "Programmatore");
			amr.rifiutaProposta("Programmatore");
			
			//Definizione delle richieste di aiuto
			Hashtable<String, String> info = new Hashtable<String, String>();
			info.put("mittente", utenti[1].getEmail());
			info.put("destinatario", utenti[7].getEmail());
			info.put("descrizione", "Portami a fare un giro!!");
			info.put("abilita", ab[7].getNome());
			RichiestaAiuto ra = rmr.addRichiesta(info);
			
			info.put("mittente", utenti[4].getEmail());
			info.put("destinatario", utenti[3].getEmail());
			info.put("descrizione", "Vorrei una ricetta!!");
			info.put("abilita", ab[3].getNome());
			ra = rmr.addRichiesta(info);
			rmr.valutaRichiesta(2, Status.RIFIUTATA);
			
			info.put("mittente", utenti[6].getEmail());
			info.put("destinatario", utenti[5].getEmail());
			info.put("descrizione", "Vorrei una riparazione ad un tavolo!!");
			info.put("abilita", ab[5].getNome());
			ra = rmr.addRichiesta(info);
			rmr.valutaRichiesta(3, Status.ACCETTATA);
			
			info.put("mittente", utenti[9].getEmail());
			info.put("destinatario", utenti[5].getEmail());
			info.put("descrizione", "Mi si è rotto l'armadio!!");
			info.put("abilita", ab[5].getNome());
			ra = rmr.addRichiesta(info);
			rmr.valutaRichiesta(4, Status.RIFIUTATA);
			
			info.put("mittente", utenti[1].getEmail());
			info.put("destinatario", utenti[9].getEmail());
			info.put("descrizione", "Mi piacerebbe un autoritratto!!");
			info.put("abilita", ab[9].getNome());
			ra = rmr.addRichiesta(info);
			rmr.valutaRichiesta(5, Status.ACCETTATA);
			Feedback fk = rmr.addFeedback(5, "Veramente molto bravo!!", 5);
			
			info.put("mittente", utenti[6].getEmail());
			info.put("destinatario", utenti[1].getEmail());
			info.put("descrizione", "Vorrei un consiglio su delle piante!!");
			info.put("abilita", ab[1].getNome());
			ra = rmr.addRichiesta(info);
			
			info.put("mittente", utenti[4].getEmail());
			info.put("destinatario", utenti[6].getEmail());
			info.put("descrizione", "Avrei bisogno di una riparazione a casa!!");
			info.put("abilita", ab[6].getNome());
			ra = rmr.addRichiesta(info);
			
			out.println();
			out.println("Popolamento del sistema terminato correttamente!!");
			
		}catch(Exception e){
			
		}
	}
}